/**
 * author:vesper.z
 * date: 2024  11:30
 * class: Test01
 * description：基础语法
 **/
class Test01 {

    /**
     * 函数定义
     * 函数定义使用fun关键字，参数格式为 参数:类型
     */

    fun sum(a: Int, b: Int): Int { //参数类型Int，放回的值Int
        return a + b
    }

    //表达式作为函数体，返回类型自动判断
    fun sum1(a: Int, b: Int) = a + b

    //public类型的参数必须声明返回类型
    public fun sum2(a: Int, b: Int): Int = a + b

    //无返回类型的参数，类型是Unit类似于java的void
    fun printSum(a: Int, b: Int): Unit {
        println(a + b)
    }

    //如果返回的类型是Unit则可以直接省略，public的方法也一样
    public fun printSum1(a: Int, b: Int) {
        println(a + b)
    }

    /**
     * 可变长函数
     * 使用关键字vararg关键字标识
     */
    fun vars(vararg strs: String) {
        println(strs.size)
        for (str in strs) {
            println(str)
        }
    }

    /**
     * Lambda (匿名函数)
     */
    //显式的类型声明。
    val sum1: (Int, Int) -> Int = { x, y ->
        x + y
    }

    //没有显式的类型声明，Kotlin编译器会自动推导出他的类型。
    val sum = { x: Int, y: Int -> x + y }

    /**
     * 定义常量和变量
     */
    //可变变量定义：var关键字，变量可以修改
    var a: Int = 2;

    //不可变变量定义，变量不可修改
    val b: Int = 2

    /**
     * 字符串模板
     */
    fun template(): Unit {
        val a: String = "Tom"
        var b: String? = "hello $a !"
        println(b)
    }

    /**
     * NULL 检查机制
     */
    fun nullCheck(): Int? {
        var name: String? = "12"
        //非空断言运算符 !!，抛出空指针异常
        val nameLength = name!!.length
        //不做处理返回null
        val nameLength1 = name?.length
        //age为空返回指定的值
        val nameLength2 = name?.length ?: -1
        //返回字符长度
        return name?.length
    }

    /**
     * 类型检测以及自动转换
     */
    fun getStringLength(obj: Any): Int? {
        if (obj is String) {
            return obj.length
        }
        return null;
    }
    fun getStringLength1(obj: Any): Int? {
        if (obj !is Int) {
            return null
        }
        //`obj` 的类型会被自动转换为 `String`
        println( "javaClass->"+ obj.javaClass.toString())
        return obj
    }
    /**
     * 区间
     */
    fun space():Unit{
        for (i in 1..4){
            println(i)
        }
        for (i in 10 downTo 0 step 2){
            println(i)
        }
        for (i in 1 until 10){
            println(i)
        }
    }


}

/**
 * 测试方法
 */
fun main(args: Array<String>) {

    var test = Test01();
//    println(test.sum(11, 22))
//    println(test.sum1(11, 22))
//    test.printSum(111, 222)
//    test.printSum1(111, 222)
//    /*可变长函数*/
//    test.vars("a", "b", "c", "d")
//    val obj: Any = "Hello, world!"
//    val str: String? = obj as? String
//    println(str?.length)
//    test.template()
//    test.nullCheck()

//    test.getStringLength(111)
//    test.getStringLength("111")
//    test.getStringLength1(11)
//    test.space()
}
